package DAO;

import AccesoBD.AccesoBaseDatos;
import Dominio.Asignatura;
import Dominio.RequerimientoAcademico;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class DAORequerimientoAcademico {

    public static final String TABLA_REQUERIMIENTOS_ACADEMICOS = "requerimientos_academicos";
    public static final String COLUMNA_CLAVE_PROGRAMA_EDUCATIVO = "clv_programa_educativo";
    public static final String COLUMNA_CLAVE_ASIGNATURA_DEPENDIENTE = "asignatura_dependiente";
    public static final String COLUMNA_CLAVE_ASIGNATURA_INDEPENDIENTE = "asignatura_independiente";
    private DAOAsignatura daoasignatura;
    private AccesoBaseDatos acceso = new AccesoBaseDatos();
    private Connection conexion = null;

    public DAORequerimientoAcademico() {
        this.conexion = acceso.abrirConexion();
        this.daoasignatura = new DAOAsignatura();
    }

    public RequerimientoAcademico obtenerRequerimientoAcademico(Asignatura asignaturaDependiente, int clavePrograma) {
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT * FROM " + this.TABLA_REQUERIMIENTOS_ACADEMICOS + " WHERE " + this.COLUMNA_CLAVE_ASIGNATURA_DEPENDIENTE
                    + " ='" + asignaturaDependiente.getClave_asignatura() + "' AND " + this.COLUMNA_CLAVE_PROGRAMA_EDUCATIVO
                    + "='" + clavePrograma + "'";
            ResultSet resultado = sentencia.executeQuery(query);
            ArrayList<Asignatura> asignaturas = new ArrayList<Asignatura>();
            while (resultado.next()) {
                int claveAsignatura = resultado.getInt(3);
                Asignatura asignatura = daoasignatura.buscarAsignatura(claveAsignatura);
                asignaturas.add(asignatura);
            }
            RequerimientoAcademico requerimiento = new RequerimientoAcademico(asignaturaDependiente, asignaturas, clavePrograma);
            return requerimiento;
        } catch (SQLException ex) {
            System.out.println("Ocurrió un problema al intentar recuperar los requisitos academicos de la asignatura.\n");
            ex.printStackTrace();
        }
        return null;
    }

    public RequerimientoAcademico obtenerRequerimientoAcademico(int claveAsignaturaDependiente, int clavePrograma) {
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT * FROM " + this.TABLA_REQUERIMIENTOS_ACADEMICOS + " WHERE " + this.COLUMNA_CLAVE_ASIGNATURA_DEPENDIENTE
                    + " ='" + claveAsignaturaDependiente + "' AND " + this.COLUMNA_CLAVE_PROGRAMA_EDUCATIVO
                    + "='" + clavePrograma + "'";
            ResultSet resultado = sentencia.executeQuery(query);
            ArrayList<Asignatura> asignaturas = new ArrayList<Asignatura>();
            while (resultado.next()) {
                int claveAsignatura = resultado.getInt(4);
                Asignatura asignatura = daoasignatura.buscarAsignatura(claveAsignatura);
                asignaturas.add(asignatura);
            }
            RequerimientoAcademico requerimiento;
            requerimiento = new RequerimientoAcademico(daoasignatura.buscarAsignatura(claveAsignaturaDependiente), asignaturas, clavePrograma);
            return requerimiento;
        } catch (SQLException ex) {
            System.out.println("Ocurrió un problema al intentar recuperar los requisitos academicos de la asignatura.\n");
            ex.printStackTrace();
        }
        return null;
    }

    public boolean registraRequerimientoAcademico(RequerimientoAcademico requerimiento) {
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ArrayList<Asignatura> asignaturasRequeridas = requerimiento.getAsignaturasRequeridas();
            String queryBase = "INSERT INTO " + this.TABLA_REQUERIMIENTOS_ACADEMICOS + "(" + this.COLUMNA_CLAVE_PROGRAMA_EDUCATIVO
                    + "," + this.COLUMNA_CLAVE_ASIGNATURA_DEPENDIENTE + "," + this.COLUMNA_CLAVE_ASIGNATURA_INDEPENDIENTE + ") VALUES ('"
                    + requerimiento.getClavePrograma() + "','" + requerimiento.getAsignaturaDependiente().getClave_asignatura() + "','";
            for (int i = 0; i < asignaturasRequeridas.size(); i++) {
                String query = queryBase + asignaturasRequeridas.get(i) + "');";
                sentencia.executeUpdate(query);
            }
            return true;
        } catch (SQLException ex) {
            System.out.println("Ocurrió un problema al intentar registrar los requisitos academicos de la asignatura.\n");
            ex.printStackTrace();
        }
        return false;
    }

    public void agregaAsignaturaRequerida(Asignatura asignaturaDependiente, Asignatura asignaturaRequerida, int clavePrograma) {
        if (!existeAsignaturaRequerida(asignaturaDependiente, asignaturaRequerida, clavePrograma)) {
            try {
                Statement sentencia = acceso.crearSentenciaBD(conexion);
                String query = "INSERT INTO " + this.TABLA_REQUERIMIENTOS_ACADEMICOS + "(" + this.COLUMNA_CLAVE_PROGRAMA_EDUCATIVO
                        + "," + this.COLUMNA_CLAVE_ASIGNATURA_DEPENDIENTE + "," + this.COLUMNA_CLAVE_ASIGNATURA_INDEPENDIENTE + ") VALUES ('"
                        + clavePrograma + "','" + asignaturaDependiente.getClave_asignatura() + "','" + asignaturaRequerida.getClave_asignatura() + "');";
                sentencia.executeUpdate(query);
            } catch (SQLException ex) {
                System.out.println("Ocurrió un problema al intentar registrar la asignatura como requerimiento académico.\n");
                ex.printStackTrace();
            }
        }
    }

    public boolean existeAsignaturaRequerida(Asignatura asignaturaDependiente, Asignatura asignaturaRequerida, int clavePrograma) {
        boolean existe = false;
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT * FROM " + DAORequerimientoAcademico.TABLA_REQUERIMIENTOS_ACADEMICOS + " WHERE " + DAORequerimientoAcademico.COLUMNA_CLAVE_ASIGNATURA_DEPENDIENTE
                    + " ='" + asignaturaDependiente.getClave_asignatura() + "' AND " + DAORequerimientoAcademico.COLUMNA_CLAVE_PROGRAMA_EDUCATIVO
                    + "='" + clavePrograma + "' AND " + DAORequerimientoAcademico.COLUMNA_CLAVE_ASIGNATURA_INDEPENDIENTE + "='" + asignaturaRequerida.getClave_asignatura() + "'";
            ResultSet resultado = sentencia.executeQuery(query);
            if (resultado.first()) {
                existe = true;
            }
        } catch (SQLException ex) {
            System.out.println("Ocurrió un problema al intentar recuperar la asignatura como requerimiento académico.\n");
        }
        return existe;
    }

    public void registrarReqAcademico(int claveInde1, int clavePE, int claveDep) {
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "INSERT INTO " + this.TABLA_REQUERIMIENTOS_ACADEMICOS + "(" + this.COLUMNA_CLAVE_PROGRAMA_EDUCATIVO
                    + "," + this.COLUMNA_CLAVE_ASIGNATURA_DEPENDIENTE + "," + this.COLUMNA_CLAVE_ASIGNATURA_INDEPENDIENTE + ") VALUES ('"
                    + clavePE + "','" + claveDep + "','" + claveInde1 + "');";
            sentencia.executeUpdate(query);
        } catch (SQLException ex) {
            Logger.getLogger(DAORequerimientoAcademico.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public boolean existeAsignaturaDependiente(int claveDep) {
        boolean existe = false;
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT * FROM " + TABLA_REQUERIMIENTOS_ACADEMICOS + " WHERE " + COLUMNA_CLAVE_ASIGNATURA_DEPENDIENTE
                    + " ='" + claveDep + "'";
            ResultSet resultado = sentencia.executeQuery(query);
            if (resultado.first()) {
                existe = true;
            }
        } catch (SQLException ex) {
            System.out.println("Ocurrió un problema al intentar recuperar la asignatura como requerimiento académico.\n");
        }
        return existe;
    }

    public void eliminarAsignaturaDependiente(int claveDep) {
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "DELETE FROM " + TABLA_REQUERIMIENTOS_ACADEMICOS + " WHERE " + COLUMNA_CLAVE_ASIGNATURA_DEPENDIENTE + " = '"
                    + claveDep + "'";
            sentencia.executeUpdate(query);
        } catch (SQLException ex) {
            Logger.getLogger(DAORequerimientoAcademico.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void cerrarConexionARequerimientosAcademicos() {
        acceso.cerrarConexion(conexion);
    }
}
